home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tie / src / tie.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  8KB  |  299 lines

  1. /*
  2.  *  TMENU.INF Editor    <TIE.EXP>
  3. */
  4.  
  5. char    *VERSION = "V1.17" ;
  6. char    *DATE    = "91/08/15" ;
  7.  
  8. #define VRAM_MAIN_LINE
  9. #include "config.h"
  10. #include "edit.h"
  11. #include "moscsr.def"
  12.  
  13. #include <snd.h>
  14.  
  15. char    egbwork[ EgbWorkSize ] ;
  16. char    moswork[ MosWorkSize ] ;
  17. int     page_ofs = 0x00000 ;
  18. int     cancel_on = FALSE ;
  19.  
  20. char    *msg[ MAX_DSP_MSG ] ;
  21. char    *msg_error = "! エラー !" ;
  22. char    *msg_kakunin = "確  認" ;
  23. char    *msg_btn1[MAX_BTN_MSG+1] = { "確  認", NULL } ;
  24. char    *msg_btn2[MAX_BTN_MSG+1] = { "実  行", "中  止", NULL } ;
  25.  
  26. CONFIG  setup =
  27. {
  28.     DEF_EDIT_SCREEN,    /*  0:CFG_ES_MOVE  1:CFG_ES_EDIT  */
  29.     DEF_FUNC,           /*  0:FUNC_MOVE  1:FUNC_CHG  2:FUNC_DEL 3:FUNC_EDIT  */
  30. } ;
  31.  
  32.  
  33. extern  char    *param( char *file ) ;
  34. extern  int     edt( char *file ) ;
  35. extern  void    configuration( char *fname ) ;
  36. extern  int     readinf( char *file ) ;
  37.  
  38.  
  39.  
  40. void    main( int argc, char **argv )
  41. {
  42.     char    *file = NULL ;
  43.     char    crrdir[256], *config, *p ;
  44.     CONFIG  opt = { -1, -1 } ;
  45.  
  46.     /*  カレント・ディレクトリを退避  */
  47.     getdir( crrdir ) ;
  48.     if( ( p = strrchr( crrdir, '\\' ) ) != NULL && strlen( crrdir ) > 3 )
  49.         *p = '\0' ;     /*  余計な \ をつぶす  */
  50.     chdrv( *crrdir - 'A' ) ;
  51.  
  52.     /*  モジュールの存在するディレクトリから定義ファイルを読む  */
  53.     if( ( config = (char *)malloc( (unsigned)strlen( argv[0] )+16 ) ) == NULL )
  54.     {
  55.         fprintf( stderr, "メモリが獲得できないので処理を中断します\n" ) ;
  56.         exit( 1 ) ;
  57.     }
  58.     strcpy( config, argv[0] ) ;
  59.     if( ( p = strrchr( config, '\\' ) ) == NULL )   /*  \ を含んでない  */
  60.         *config = '\0' ;
  61.     else                                            /*  \ を含んでいる  */
  62.         *++p = '\0' ;
  63.     strcat( config, CONFIG_FILE ) ;
  64.  
  65.     /*  パラメータとオプションの解釈  */
  66.     while( -- argc > 0 )
  67.     {
  68.         if( *(p = *++argv) == '/' || *p == '-' )
  69.         {
  70.             while( *++p != '\0' )
  71.                 switch( tolower( *p ) )
  72.                 {
  73.                   case 'c':     /*  設定ファイルの位置  */
  74.                     if( strlen( p+1 ) > 0 )
  75.                     {
  76.                         strcpy( config, p+1 ) ;
  77.                         if( access( config, "r" ) == ERROR )
  78.                         {
  79.                             if( config[ strlen( config )-1 ] != '\\' )
  80.                                 strcat( config, "\\" ) ;
  81.                             strcat( config, CONFIG_FILE ) ;
  82.                         }
  83.                     }
  84.                     goto next ;
  85.  
  86.                   case 's':     /*  起動時の画面  */
  87.                     if( isdigit( *(p+1) ) )
  88.                         opt.edit_screen = atoi( p+1 ) ;
  89.                     goto next ;
  90.  
  91.                   case 'm':     /*  移動画面の初期ファンクション  */
  92.                     if( isdigit( *(p+1) ) )
  93.                         opt.func = atoi( p+1 ) ;
  94.                     goto next ;
  95.  
  96.                   default:
  97.                     break ;
  98.                 }
  99.         }
  100.         else
  101.             file = p ;
  102.  
  103. next:   continue ;
  104.     }
  105.  
  106.     configuration( config ) ;       /*  定義ファイルを読み込んで初期化  */
  107.  
  108.     if( opt.edit_screen != -1 )
  109.         setup.edit_screen = opt.edit_screen ;
  110.     if( opt.func != -1 )
  111.         setup.func = opt.func ;
  112.  
  113.     if( setup.edit_screen < 0 || setup.edit_screen > 1 )
  114.         setup.edit_screen = 0 ;
  115.     if( setup.func < 0 || setup.func > 4 )
  116.         setup.func = 0 ;
  117.  
  118.     /*  オプションによるファイル指定は特別処理  */
  119.     if( ( p = param( file ) ) != NULL )
  120.         file = p ;
  121.     else
  122.     {
  123.         /*  ファイル指定されていなければ、
  124.             カレントドライブの TMENU.ICN を読み込む  */
  125.         readicon( "\\tmenu.icn" ) ; /*  アイコン読み込み  */
  126.         load_count ++ ;
  127.     }
  128.  
  129.     /*  グラフィックとマウスの初期化  */
  130.     EGB_init( egbwork, EgbWorkSize ) ;
  131.     EGB_resolution( egbwork, 0,3 ) ;
  132.     EGB_resolution( egbwork, 1,3 ) ;
  133.  
  134.     SND_elevol_init() ;     /*  電子ボリュームとパッドI/Oの初期化  */
  135.  
  136.     MOS_start( moswork, MosWorkSize ) ;
  137.     MOS_resolution( 0, 3 ) ;
  138.     MOS_resolution( 1, 3 ) ;
  139.     MOS_writePage( 0 ) ;
  140.     MOS_horizon ( MIN_HORIZON,  MAX_HORIZON ) ;
  141.     MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
  142.  
  143.     mos_ptn( 0 ) ;
  144.     MOS_disp( mos_disp = FALSE ) ;
  145.  
  146.     ctblset( CHR_COL, BAK_COL ) ;
  147.  
  148.     EGB_displayPage( egbwork, 1, 3 ) ;
  149.  
  150.     cls( 1, 0 ) ;
  151.     chg_palette( 1, 2 ) ;
  152.  
  153.     cls( 0, 15 ) ;
  154.     chg_palette( 0, now_palet = 0 ) ;
  155.  
  156.     /*  ファイルバッファの初期化  */
  157.     init_file_buf( MULTI_BUF ) ;
  158.  
  159.     KAN_start() ;
  160.  
  161.     /*  メイン・ループに処理を委託  */
  162.     edt( file ) ;
  163.  
  164.     /*  マウスイベント終了  */
  165.     EVT_reset() ;
  166.  
  167.     /*  マウスの終了宣言  */
  168.     MOS_end() ;
  169.  
  170.     KAN_end() ;
  171.  
  172.     cls( 0, 8 ) ;
  173.     cls( 1, 0 ) ;
  174.  
  175.     /*  起動時のカレント・ディレクトリへ復帰  */
  176.     chdrv( crrdir[0] - 'A' ) ;
  177.     chdir( crrdir ) ;
  178.  
  179.     exit( 0 ) ;
  180. }
  181.  
  182.  
  183. /*  config ファイルの読み込み  */
  184.  
  185. void    configuration( char *fname )
  186. {
  187.     FILE    *fp ;
  188.     char    buf[ 256 ], *p ;
  189.     int     tmp ;
  190.  
  191.     if( ( fp = fopen( fname, "r" ) ) == NULL )
  192.         return ;
  193.  
  194.     while( fgets( buf, 255, fp ), feof( fp ) == FALSE )
  195.     {
  196.         if( *buf == '#' || *buf == '\n' || *buf == ' ' )   /*  スキップ  */
  197.             continue ;
  198.  
  199.         p = buf ;
  200.         while( *p != '\0' && *p != ' ' )    /*  第一パラメータをとばして  */
  201.             p ++ ;
  202.         if( *p == '\0' )                    /*  第二パラメータ以降なし  */
  203.             continue ;
  204.         *p++ = '\0' ;
  205.         while( *p != '\0' && *p == ' ' )    /*  第二パラメータの頭だし  */
  206.             p ++ ;
  207.         if( sscanf( p, "%d", &tmp ) != 1 )  /*  第二パラメータを数値変換  */
  208.             continue ;
  209.  
  210.         if( strcmp( buf, "EDIT_SCREEN" ) == 0 )
  211.             setup.edit_screen = ( tmp == 1 ) ? CFG_ES_EDIT : CFG_ES_MOVE ;
  212.         else if( strcmp( buf, "MOVE_MODE" ) == 0 )
  213.             switch( tmp )
  214.             {
  215.               default:  setup.func = FUNC_MOVE ; break ;
  216.               case 1:   setup.func = FUNC_CHG ; break ;
  217.               case 2:   setup.func = FUNC_DEL ; break ;
  218.               case 3:   setup.func = FUNC_EDIT ; break ;
  219.             }
  220.     }
  221.  
  222.     fclose( fp ) ;
  223. }
  224.  
  225. /*  パラメータとしてファイルが指定されていたら、
  226.     そのドライブ・ディレクトリへ移動し、フルパスリストを作る  */
  227.  
  228. static  char    *param( char *file )
  229. {
  230.     static  char    crrdir[ 256 ] ;
  231.     REGS    char    *p, *fname ;
  232.  
  233.     if( file == NULL || *file == '\0' )
  234.         return( NULL ) ;
  235.     if( isalpha( *file ) && *(file+1) == ':' )
  236.     {
  237.         chdrv( toupper( *file ) - 'A' ) ;
  238.         file += 2 ;
  239.     }
  240.     if( ( p = strrchr( file, '\\' ) ) != NULL ) /*  ディレクトリ指定あり  */
  241.     {
  242.         if( p > file )      /*  ディレクトリ名だけを分離  */
  243.         {
  244.             *p = '\0' ;
  245.             chdir( file ) ;
  246.         }
  247.         else                /*  ディレクトリ名はルート  */
  248.             chdir( "\\" ) ;
  249.         fname = p + 1 ;
  250.     }
  251.     else                    /*  ディレクトリ指定なし  */
  252.         fname = file ;
  253.  
  254.     getdir( crrdir ) ;          /*  カレントまでのフルパス  */
  255.     strcat( crrdir, fname ) ;   /*  カレントファイルのフルパスできあがり  */
  256.  
  257.     if( ( p = strchr( fname, '.' ) ) == NULL )      /*  拡張子なし  */
  258.         strcat( crrdir, ".INF" ) ;
  259.  
  260.     for( p = crrdir ; *p != '\0' ; p ++ )
  261.         *p = toupper( *p ) ;
  262.  
  263.     return( crrdir ) ;
  264. }
  265.  
  266. static  int     edt( char *file )
  267. {
  268.     static  char    path[ 256 ] = { '\0' } ;
  269.     static  int     (*edit_func)( char * ) = (int (*)(char *))0 ;
  270.  
  271.     if( (int)edit_func == 0 )
  272.         switch( setup.edit_screen )
  273.         {
  274.           case CFG_ES_MOVE: edit_func = edit_move ; break ;
  275.           case CFG_ES_EDIT: edit_func = edit_text ; break ;
  276.         }
  277.  
  278.     if( file == NULL )      /*  コマンドライン指定なし  */
  279.     {
  280.         if( ( file = load_file() ) == NULL || *file == '\0' )
  281.             maxnum = 0 ;
  282.         else
  283.             strcpy( path, file ) ;
  284.     }
  285.     else                    /*  コマンドライン指定あり  */
  286.     {
  287.         if( readinf( file ) != ERR_NOERROR )    /*  ロードを実行  */
  288.             maxnum = 0 ;
  289.         else
  290.             strcpy( path, file ) ;
  291.     }
  292.  
  293.     while( edit_func( path ) == RET_MODE )
  294.         edit_func = ( edit_func == edit_move ) ? edit_text : edit_move ;
  295.  
  296.     return 0 ;
  297. }
  298.  
  299.